#include "socket.h"

int mainSocketServer(struct sockaddr_un*data){

	int sock,conectSocket;

	system("unlink socket_path");

	data->sun_family = AF_UNIX;

	strcpy(data->sun_path, SOCK_PATH);

	crearSocket(&sock);

	realizarBind(&sock,data);

	realizarListen(sock);

	return sock;
}

int mainSocketCliente(){

	int sock;

	struct sockaddr_un data;

	memset(&data,0,sizeof(struct sockaddr_un));

	data.sun_family = AF_UNIX;

	strcpy(data.sun_path, SOCK_PATH);

	crearSocket(&sock);

	conectar(sock,data);

	return sock;
}

/*__________________________________________________________________________________________*/

int crearSocket(int* nuevoSocket){

	*nuevoSocket = socket(AF_UNIX, SOCK_STREAM, 0);

	if(*nuevoSocket < 0){
		printf("Fallo socket()\n");
		return 1;
	}
	else{
		printf("socket padre= %d",*nuevoSocket);
		return 0;
	}


}

/*__________________________________________________________________________________________*/

int realizarBind(int* nuevoSocket,struct sockaddr_un* local){

	int resultado;

	resultado = bind(*nuevoSocket, (struct sockaddr*)local, SUN_LEN(local));

	if(resultado < 0){
		printf("Fallo bind() %d\n",resultado);
		return 1;
	}
	else{
		return 0;
	}

}

/*__________________________________________________________________________________________*/

int realizarListen(int nuevoSocket){

	int resultado = -1;

	resultado = listen(nuevoSocket,1);

	if(resultado != 0){
		printf("Fallo listen()\n");
		return 1;
	}
	else{
		return 0;
	}
}

/*__________________________________________________________________________________________*/

int aceptarCliente(int nuevoSocket,struct sockaddr_un* local, int semaf){

	int socketCliente;
	int len;

	len = sizeof(struct sockaddr);
	socketCliente = accept(nuevoSocket,NULL,NULL);
	if(socketCliente == -1) {
			printf("Fallo accept()\n");
			return (-1);
	}
	else{
		return socketCliente;
	}
}
/*________________________________________________________________________________*/

int cerrarSocket(int*nuevoSocket){

	close(*nuevoSocket);

	return 0;

}

/*________________________________________________________________________________*/

int conectar(int nuevoSocket,struct sockaddr_un local){

	int resultado;

	resultado = connect(nuevoSocket, (struct sockaddr *)&local, SUN_LEN(&local));

	if(resultado == 0)
		return 0;

	else{
		printf("Fallo connect()\n");
		return 1;
	}

}

int enviarDatos(char*buffer,int tamanio,int socketEnvio){

	int resultado;

	resultado = send(socketEnvio,buffer,tamanio,MSG_WAITALL);

	if(resultado == EL_ERROR){
		//printf("EL_ERROR en send()\n");
		return 1;
	}
	else{
		//printf("Envio exitoso\n");
		return 0;
	}

}

/*________________________________________________________________________________*/

int recibirDatos(char*buffer,int socketRecv){

	int resultado;

	resultado = recv(socketRecv,buffer,519,MSG_WAITALL);

	if(resultado > 0){

		//printf("Recepcion exitosa\n");

		return resultado;

	}

	else{
		printf("Recepcion fallida ppd\n");
		return (-1);
	}

}
